package com.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author hdu_huang
 * @since 2024/2/29 16:28
 * java-jwt简单   jjwt
 */

public class JWTUtil {

    //OAuth2.0的四种授权方式  客户端模式、密码模式、简易模式，授权码模式[一次性code换取token]

    final static String JWT_SECRET = "1194129822";

    // JWT(JSON WEB TOKEN)由三部分组成 base64(header).base64(payload[claims]).signature  header和payload都是json, signature是hash指纹防止伪造
    //! 更安全可以使用RSA算法  JWT-RSA
    public static void main(String[] args) throws Exception {

        JWTCreator.Builder jwtBuilder = JWT.create();

        Algorithm HMAC256 = Algorithm.HMAC256(JWT_SECRET);

        HashMap<String, Object> headers = new HashMap<>();

        headers.put("typ", "jwt");   //设置token的type为jwt
        headers.put("alg", "hs256");  //表明加密的算法为HS256

        //开始生成token
        //我们将之前准备好的header设置进去
        String token = jwtBuilder.withHeader(headers)

                //PayLoad,  Claim中的键值对可自定义
                .withClaim("userId", 1001)
                .withClaim("username", "刚子哥")
                .withClaim("isVIP", true)
                //设置token的subject
                .withSubject("test")
                //token失效时间，这里为一天后失效
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24))
                //设置该jwt的发行时间，一般为当前系统时间
                .withIssuedAt(new Date(System.currentTimeMillis()))
                //token的发行者
                .withIssuer("hdu_huang")
                .sign(HMAC256);

        System.out.println(token);

        //验证失败 抛异常
        JWTVerifier verifier = JWT.require(HMAC256).withIssuer("hdu_huang").build();
        DecodedJWT jwt = verifier.verify(token);

        //header和payload 都是base64编码的json
        String header = jwt.getHeader();
        String payload = jwt.getPayload();

        Map<String, Claim> claims = jwt.getClaims();

        System.out.println(new String(Base64.getDecoder().decode(header)));
        System.out.println(payload);
        System.out.println(claims);


    }

    public static void verifierJWTToken(String token) {
    }
}
